package LeetCodeHot100TopInterview;

public class Q042_TrapRainWater {
    //接雨水问题
    //给定 n 个非负整数表示每个宽度为 1 的柱子的高度图，计算按此排列的柱子，下雨之后能接多少雨水
    //对比 Q011 ==> 两个柱子之间最大面积 ==> 这边是累加问题
    public int trap(int[] height) {
        if (height == null || height.length < 3){
            return 0;
        }
        //预处理数组 可以但没必要
        //最两侧柱子不可能存水
        //关注点在每个柱子上方能存多少水
        int left = 1;
        int right = height.length - 2;
        int leftMax = height[0];
        int rightMax = height[height.length - 1];
        int water = 0;
        while (left < right){
            if (leftMax <= rightMax){
                //防止左边最高的比我还矮 那就存不了水
                water += Math.max(0, leftMax - height[left]);
                leftMax = Math.max(leftMax, height[left]);
                left ++;
            }else {
                //防止右边最高的比我还矮 那就存不了水
                water += Math.max(0, rightMax - height[right]);
                rightMax = Math.max(rightMax, height[right]);
                right --;
            }

        }
        return water;
    }

    public static void main(String[] args) {
        Q042_TrapRainWater fun = new Q042_TrapRainWater();
        fun.trap(new int[]{0,1,0,2,1,0,1,3,2,1,2,1});
    }

}
